package com.zhu.rtda;

import com.zhu.rtda.heap.Method;

/**
 * Thread 表示 JVM 中的一个执行线程。
 * <p>
 * 它包含：
 * - 当前正在执行的指令地址（PC 寄存器）
 * - 虚拟机栈（由多个栈帧组成）
 * </p>
 * <p>
 * 注意：这里模拟的是 JVM 线程，不是操作系统线程。
 * </p>
 */
public class Thread {

    // region --- 字段 ---

    /** 当前正在执行的指令地址（程序计数器） */
    private int pc;

    /** 虚拟机栈，最大深度为 1024 */
    private Stack stack;

    // endregion

    // region --- 构造函数 ---

    /**
     * 创建一个新线程，默认栈大小为 1024。
     */
    public Thread() {
        this.stack = new Stack(1024);
    }

    // endregion

    // region --- Getter / Setter ---

    public int getPC() {
        return pc;
    }

    public void setPC(int pc) {
        this.pc = pc;
    }

    public Stack getStack() {
        return stack;
    }

    // endregion

    // region --- 栈操作方法 ---

    /**
     * 将一个栈帧压入当前线程的虚拟机栈。
     *
     * @param frame 要压入的栈帧
     */
    public void pushFrame(Frame frame) {
        this.stack.push(frame);
    }

    /**
     * 从当前线程的虚拟机栈中弹出一个栈帧。
     *
     * @return 弹出的栈帧
     */
    public Frame popFrame() {
        Frame frame = this.stack.pop();
        if (frame != null) {
            // 可选：清理引用
            frame.setLower(null);
        }
        return frame;
    }

    /**
     * 获取当前栈顶的栈帧（即当前正在执行的方法）。
     *
     * @return 当前栈帧
     */
    public Frame currentFrame() {
        return this.stack.top();
    }

    /**
     * 为指定方法创建一个新的栈帧。
     *
     * @param method 目标方法
     * @return 新创建的栈帧
     */
    public Frame newFrame(Method method) {
        return new Frame(this, method);
    }

    // endregion
}